package zpqy

import (
	"bytes"
	"fmt"
	"text/template"
)

// GameSelectData 用于游戏选择模板的数据结构
type GameSelectData struct {
	UserInput string
	GameList  string
}

// TeacherSelectData 用于导师选择模板的数据结构
type TeacherSelectData struct {
	UserInput   string
	TeacherList string
}

// GameConclusionData 用于游戏结论模板的数据结构
type GameConclusionData struct {
	UserInput     string
	SelectedGames []GameInfo // 改为切片以支持多个游戏
}

// TeacherConclusionData 用于导师结论模板的数据结构
type SingleTeacherConclusionData struct {
	UserInput string
	Teacher   TeacherInfo
}

type TeacherConclusionData struct {
	UserInput        string
	SelectedTeachers []TeacherInfo
}

type TeacherConclusion struct {
	TeacherName string `json:"teacher_name"`
	Title       string `json:"title"`
	Content     string `json:"content"`
}

// GameInfo 游戏信息结构
type GameInfo struct {
	Name              string
	Introduction      string
	TheoryExplanation string
}

func (gi GameInfo) String() string {
	return fmt.Sprintf("name:%s,introduction:%s,theroyExplanation:%s", gi.Name, gi.Introduction, gi.TheoryExplanation)
}

// TeacherInfo 导师信息结构
type TeacherInfo struct {
	Name string
	Desc string
}

func (ti TeacherInfo) String() string {
	return fmt.Sprintf("name:%s,desc:%s", ti.Name, ti.Desc)
}

// 模板常量定义
const (
	gameSelectTemplate = `你是一位专业的人生体验推荐师。请根据用户烦恼，从{{.GameList}}里为他推荐5个最适合的游戏。
【用户烦恼】
{{.UserInput}}
【推荐要求】
直接返回结果，不需要解释。
【输出格式】
请按照以下JSON格式返回：
{
  "games": [
    {
	  "game_id": id
    }
  ]
}`

	teacherSelectTemplate = `你是一位专业的人生体验推荐师。请根据用户烦恼，从{{.TeacherList}}里为他推荐3位最适合的导师。

【用户烦恼】
{{.UserInput}}

【推荐要求】
直接返回结果，不需要解释

【输出格式】
请按照以下JSON格式返回：
{
  "teachers": [
    {
      "teacher_id": "导师id"
    }
  ]
}`

	gameConclusionTemplate = `你是一位专业的游戏推荐师。请根据用户烦恼和已经筛选出的游戏，给每一个游戏都生成一段推荐的原因。

【用户烦恼】
{{.UserInput}}

【所选游戏】
{{range .SelectedGames}}
- 名称：{{.Name}}
- 介绍：{{.Introduction}}
- 理论解释：{{.TheoryExplanation}}
{{end}}

【推荐要求】
1. 直接输出推荐内容，不要任何标题、前缀、序号
2. 语言温暖、细腻、有画面感，避免说教或机械结构
3. 每个游戏的推荐原因控制在120字左右
4. 总字数控制在700字以内
5. 不要使用Markdown、代码块、HTML标签
6. 结尾自然收束，不要加套话
7. 把游戏名字写在推荐语前面，如"[游戏名]：推荐语"

请开始生成：`

	singleTeacherConclusionTemplate = `你是一位专业的人生体验推荐师。请根据用户烦恼和导师信息，为这位导师生成推荐语,并给推荐语取一个第一次xxx的名字。

【导师信息】
- 名称：{{.Teacher.Name}}
- 介绍：{{.Teacher.Desc}}

【用户烦恼】
{{.UserInput}}

【格式要求】
1. 直接输出推荐内容，不要任何标题、前缀、序号
2. 语言温暖、细腻、有画面感，避免说教或机械结构
3. 严格控制在250字左右
4. 不要使用Markdown、代码块、HTML标签
5. 结尾自然收束，不要加套话

【输出格式示例】
{
  "title": "第一次xxx",
  "content": "推荐语",
  "teacher_name": "导师名字"
}

请开始生成：`

	finalTeacherConclusionTemplate = `方案二：3场深度沉浸的人生第一次体验
从「人生第一次引导师库」精选3场体验，像打开三扇专注力修炼之门：

{{range .}}
{{.Title}} (引导师:{{.TeacherName}})
→ 为什么适合你：
{{.Content}}
{{end}}

你会收到一张专属能量地图，上面标记着："当处在嘈杂环境时，你的听觉敏感度是他人3倍"或"下午3点你的逻辑脑进入巅峰状态"。了解自己不是修正弱点，而是学会用身体信号导航当下。`
)

// 模板名称常量
const (
	gameSelectTemplateName              = "gameSelect"
	teacherSelectTemplateName           = "teacherSelect"
	gameConclusionTemplateName          = "gameConclusion"
	singleTeacherConclusionTemplateName = "singleTeacherConclusion"
	finalTeacherConclusionTemplateName  = "finalTeacherConclusion"
)

// 预编译模板池
var (
	gameSelectTemplateCache              *template.Template
	teacherSelectTemplateCache           *template.Template
	gameConclusionTemplateCache          *template.Template
	singleTeacherConclusionTemplateCache *template.Template
	finalTeacherConclusionTemplateCache  *template.Template
)

// 初始化模板池
func init() {
	var err error

	gameSelectTemplateCache, err = template.New(gameSelectTemplateName).Parse(gameSelectTemplate)
	if err != nil {
		panic("failed to parse gameSelectTemplate: " + err.Error())
	}

	teacherSelectTemplateCache, err = template.New(teacherSelectTemplateName).Parse(teacherSelectTemplate)
	if err != nil {
		panic("failed to parse teacherSelectTemplate: " + err.Error())
	}

	gameConclusionTemplateCache, err = template.New(gameConclusionTemplateName).Parse(gameConclusionTemplate)
	if err != nil {
		panic("failed to parse gameConclusionTemplate: " + err.Error())
	}

	singleTeacherConclusionTemplateCache, err = template.New(singleTeacherConclusionTemplateName).Parse(singleTeacherConclusionTemplate)
	if err != nil {
		panic("failed to parse singleTeacherConclusionTemplate: " + err.Error())
	}

	finalTeacherConclusionTemplateCache, err = template.New(finalTeacherConclusionTemplateName).Parse(finalTeacherConclusionTemplate)
	if err != nil {
		panic("failed to parse finalTeacherConclusionTemplate: " + err.Error())
	}
}

// GenerateGameSelectPrompt 生成游戏选择提示
func GenerateGameSelectPrompt(data GameSelectData) (string, error) {
	return executeTemplate(gameSelectTemplateCache, data)
}

// GenerateTeacherSelectPrompt 生成导师选择提示
func GenerateTeacherSelectPrompt(data TeacherSelectData) (string, error) {
	return executeTemplate(teacherSelectTemplateCache, data)
}

// GenerateGameConclusionPrompt 生成游戏结论提示
func GenerateGameConclusionPrompt(data GameConclusionData) (string, error) {
	return executeTemplate(gameConclusionTemplateCache, data)
}

// GenerateTeacherConclusionPrompt 生成单个导师结论提示
func GenerateSingleTeacherConclusionPrompt(data SingleTeacherConclusionData) (string, error) {
	return executeTemplate(singleTeacherConclusionTemplateCache, data)
}

// GenerateFinalTeacherConclusionPrompt 生成最终导师结论提示
func GenerateFinalTeacherConclusionPrompt(teacherConclusions []TeacherConclusion) (string, error) {
	return executeTemplate(finalTeacherConclusionTemplateCache, teacherConclusions)
}

// executeTemplate 执行模板并返回结果字符串
func executeTemplate(tmpl *template.Template, data interface{}) (string, error) {
	var buf bytes.Buffer
	if err := tmpl.Execute(&buf, data); err != nil {
		return "", err
	}
	return buf.String(), nil
}
